﻿\subsection{MIPS}

По какой-то причине, оптимизирующий GCC 4.4.5 сгенерировал просто инструкцию деления:

\lstinputlisting[caption=\Optimizing GCC 4.4.5 (IDA),style=customasmMIPS]{\CURPATH/MIPS_O3_IDA_RU.lst}

\myindex{MIPS!\Instructions!BREAK}

И кстати, мы видим новую инструкцию: BREAK. Она просто генерирует исключение.

В этом случае, исключение генерируется если делитель 0 (потому что в обычной математике нельзя
делить на ноль).

Но компилятор GCC наверное не очень хорошо оптимизировал код, и не заметил, что \$V0 не бывает нулем.
Так что проверка осталась здесь.

Так что если \$V0 будет каким-то образом 0, будет исполнена BREAK, сигнализирующая в \ac{OS} 
об исключении.
\myindex{MIPS!\Instructions!MFLO}

В противном случае, исполняется MFLO, берущая результат деления из регистра LO и копирующая его в \$V0.

\myindex{MIPS!\Registers!LO}
\myindex{MIPS!\Registers!HI}

Кстати, как мы уже можем знать, инструкция MUL оставляет старшую 32-битную часть результата
в регистре HI и младшую 32-битную часть в LO.

DIV оставляет результат в регистре LO и остаток в HI.

\myindex{MIPS!\Instructions!MFHI}
Если изменить выражение на \q{a \% 9}, вместо инструкции MFLO будет использована MFHI.
